(function(){ "use strict"; var REG = []; // registros crudos (uno por programa+aplicación), llenado vía AJAX var COL_NOSAT="#8C3B37", COL_SAT="#1E3A63", COL_SOB="#A18343"; var vw="area", bC, dC, lC; function p(n,d){return d? Math.round(n/d*100):0} function ap(d){return p(d.sat+d.sob,d.total)} function tr(s,n){return (s||"").length>n? s.slice(0,n-1)+"…":s} function gA(){return document.getElementById("FA").value} function gR(){return document.getElementById("FR").value} function gU(){return document.getElementById("FU").value} function gP(){return document.getElementById("FP").value} function nf(){return gA()==="all"&&gR()==="all"&&gU()==="all"} function uniq(arr){return arr.filter(function(v,i){return v && arr.indexOf(v)===i})} // ── Agregación: parte de REG (nivel programa+aplicación) y agrupa por la clave que se pida ── function agregarPor(lista, claveFn){ var mapa = {}; lista.forEach(function(r){ var k = claveFn(r); if(!k) return; if(!mapa[k]) mapa[k] = {name:k, total:0, noSat:0, sat:0, sob:0}; mapa[k].total += r.total; mapa[k].noSat += r.noSat; mapa[k].sat += r.sat; mapa[k].sob += r.sob; }); return Object.keys(mapa).map(function(k){return mapa[k]}); } function filtrarBase(soloArea, soloUA){ var a=gA(); return REG.filter(function(r){ if(a!=="all" && r.aplicacion!==a) return false; if(soloArea && soloArea!=="all" && r.area!==soloArea) return false; if(soloUA && soloUA!=="all" && r.ua!==soloUA) return false; return true; }); } function getTotals(){ var a=gA(),r=gR(),u=gU(),pr=gP(); var base = REG.filter(function(x){ if(a!=="all" && x.aplicacion!==a) return false; if(r!=="all" && x.area!==r) return false; if(u!=="all" && x.ua!==u) return false; if(pr!=="all" && x.programa!==pr) return false; return true; }); return base.reduce(function(acc,x){acc.total+=x.total;acc.noSat+=x.noSat;acc.sat+=x.sat;acc.sob+=x.sob;return acc},{total:0,noSat:0,sat:0,sob:0}); } function getChip(){var a=gA(),r=gR(),u=gU(),pr=gP();var partes=[pr,u,r,a].filter(function(x){return x&&x!=="all"});return partes.length?partes[0]:"Global"} function popR(){ var sel=document.getElementById("FR"); sel.innerHTML=''; uniq(REG.map(function(r){return r.area})).sort().forEach(function(a){sel.innerHTML+=''}); } function popU(area){ var sel=document.getElementById("FU"); sel.innerHTML=''; uniq(REG.filter(function(r){return area==="all"||r.area===area}).map(function(r){return r.ua})).sort().forEach(function(u){sel.innerHTML+=''}); } function popP(area,ua){ var sel=document.getElementById("FP"); sel.innerHTML=''; uniq(REG.filter(function(r){return (area==="all"||r.area===area)&&(ua==="all"||r.ua===ua)}).map(function(r){return r.programa})).sort().forEach(function(pr){sel.innerHTML+=''}); } function updBC(){ var a=gA(),r=gR(),u=gU(),pr=gP(),partes=[a,r,u,pr].filter(function(x){return x&&x!=="all"}); var h = partes.map(function(x,i){return ''+x+''}).join(' › '); if(partes.length) h+='Quitar filtros'; document.getElementById("BC").innerHTML=h; var qb=document.getElementById("QUITAR"); if(qb) qb.addEventListener("click", limpiarFiltros); ['ba','bu','bp','bq'].forEach(function(id){document.getElementById(id).classList.remove('active')}); document.getElementById(({area:'ba',ua:'bu',prog:'bp',aplic:'bq'})[vw]).classList.add('active'); } function limpiarFiltros(){ document.getElementById("FA").value="all"; document.getElementById("FR").value="all"; popU("all"); popP("all","all"); document.getElementById("FU").value="all"; document.getElementById("FP").value="all"; renderAll(); } function rHero(){ var t=getTotals(); document.getElementById("HERO-PCT").textContent = t.total? p(t.sat+t.sob,t.total)+"%" : "0%"; document.getElementById("MINI-TOTAL").textContent = t.total.toLocaleString(); var r=gR(),u=gU(); document.getElementById("MINI-AREAS").textContent = (r==="all")? uniq(REG.map(function(x){return x.area})).length : "1"; document.getElementById("MINI-UA").textContent = (u!=="all")? "1" : (r!=="all"? uniq(REG.filter(function(x){return x.area===r}).map(function(x){return x.ua})).length : uniq(REG.map(function(x){return x.ua})).length); } function getDataParaBarras(){ var r=gR(),u=gU(); if(vw==="area"){ if(nf()) return agregarPor(filtrarBase(), function(x){return x.area}); if(r!=="all"&&u==="all") return agregarPor(filtrarBase(r), function(x){return x.ua}); if(u!=="all") return agregarPor(filtrarBase(r,u), function(x){return x.programa}); return agregarPor(filtrarBase(), function(x){return x.area}); } if(vw==="ua") return agregarPor(filtrarBase(r), function(x){return x.ua}); if(vw==="prog") return agregarPor(filtrarBase(r,u), function(x){return x.programa}); return agregarPor(REG, function(x){return x.aplicacion}); } function rBar(){ var s=getDataParaBarras().sort(function(a,b){return ap(b)-ap(a)}).slice(0,10); var ti={area:"Aprobación general por área académica",ua:"Aprobación por unidad académica",prog:"Aprobación por programa",aplic:"Aprobación por aplicación"}; document.getElementById("BT").textContent=ti[vw]||"Aprobación"; if(bC) bC.destroy(); if(!window.Chart || !s.length) return; bC=new Chart(document.getElementById("BC2"),{type:"bar", data:{labels:s.map(function(d){return tr(d.name,26)}), datasets:[ {label:"Aún no satisfactorio",data:s.map(function(d){return d.noSat}),backgroundColor:COL_NOSAT}, {label:"Satisfactorio",data:s.map(function(d){return d.sat}),backgroundColor:COL_SAT}, {label:"Sobresaliente",data:s.map(function(d){return d.sob}),backgroundColor:COL_SOB} ]}, options:{indexAxis:"y",responsive:true,maintainAspectRatio:false, plugins:{legend:{display:false}}, scales:{x:{stacked:true,ticks:{color:"#9AA3B4",font:{family:"Azo Sans"}},grid:{color:"#F0EDE4"}}, y:{stacked:true,ticks:{color:"#4a4638",font:{family:"Azo Sans",size:11}},grid:{display:false}}}} }); } function rDon(){ var t=getTotals(); document.getElementById("DC").textContent = t.total? "· "+getChip() : ""; if(dC) dC.destroy(); if(!window.Chart || !t.total) return; dC=new Chart(document.getElementById("DD"),{type:"doughnut", data:{labels:["Aún no satisfactorio","Satisfactorio","Sobresaliente"], datasets:[{data:[t.noSat,t.sat,t.sob],backgroundColor:[COL_NOSAT,COL_SAT,COL_SOB],borderColor:"#FCFBF8",borderWidth:3,hoverOffset:6}]}, options:{responsive:true,maintainAspectRatio:false,cutout:"66%",plugins:{legend:{display:false}}} }); } function rLin(){ if(lC) lC.destroy(); if(!window.Chart) return; var r=gR(),u=gU(),aplicaciones=["Abril","Septiembre","Diciembre"],ds; if(vw==="aplic"||r!=="all"||u!=="all"){ ds=[{label:"% Aprobación",data:aplicaciones.map(function(ap_){ var base=filtrarBaseAplic(ap_,r,u); return base.total? p(base.sat+base.sob,base.total):null; }),borderColor:"#01152E",backgroundColor:"rgba(1,21,46,0.05)",tension:.35,fill:true,pointRadius:5,borderWidth:2,pointBackgroundColor:"#A18343"}]; } else { var cs=[COL_NOSAT,"#1E3A63","#A18343","#5b7a9e","#7a7263","#B08D57"]; var areas=uniq(REG.map(function(x){return x.area})); ds=areas.map(function(ar,i){ return {label:tr(ar,22),data:aplicaciones.map(function(ap_){var b=filtrarBaseAplic(ap_,ar,"all");return b.total?p(b.sat+b.sob,b.total):null}), borderColor:cs[i%cs.length],backgroundColor:"transparent",tension:.35,pointRadius:4,borderWidth:2,pointBackgroundColor:cs[i%cs.length]}; }); } lC=new Chart(document.getElementById("LC"),{type:"line", data:{labels:aplicaciones,datasets:ds}, options:{responsive:true,maintainAspectRatio:false, plugins:{legend:{display:ds.length>1,labels:{color:"#4a4638",font:{family:"Azo Sans",size:11},boxWidth:10,padding:12}}}, scales:{y:{min:0,max:105,ticks:{callback:function(v){return v+"%"},color:"#9AA3B4"},grid:{color:"#F0EDE4"}},x:{ticks:{color:"#9AA3B4"},grid:{display:false}}}} }); } function filtrarBaseAplic(aplicacion,area,ua){ var l=REG.filter(function(x){ if(x.aplicacion!==aplicacion) return false; if(area&&area!=="all"&&x.area!==area) return false; if(ua&&ua!=="all"&&x.ua!==ua) return false; return true; }); return l.reduce(function(acc,x){acc.total+=x.total;acc.sat+=x.sat;acc.sob+=x.sob;return acc},{total:0,sat:0,sob:0}); } // Construye el enlace al reporte generado al momento (nivel + nombre + aplicación filtrada). function enlaceReporte(nivel, nombre){ var aplicFiltro = gA(); var aplicParam = aplicFiltro==="all" ? "todas" : aplicFiltro; return egeliAjax.url + "?action=egeli_reporte&nivel=" + encodeURIComponent(nivel) + "&nombre=" + encodeURIComponent(nombre) + "&aplicacion=" + encodeURIComponent(aplicParam); } function celdaDescarga(nivel, nombre){ return 'Ver / Descargar reporte'; } function rTbl(){ var r=gR(),u=gU(); document.getElementById("TH").innerHTML='NombreTotalAún no satisf.Satisf.Sobres.% Aprob.Descarga'; var s, titulo, nivelActual, base=filtrarBase(r!=="all"?r:null, u!=="all"?u:null); if(vw==="area"){ if(nf()){s=agregarPor(REG,function(x){return x.area}); titulo="Registro por área académica"; nivelActual="area";} else if(r!=="all"&&u==="all"){s=agregarPor(filtrarBase(r),function(x){return x.ua}); titulo="Unidades académicas de "+r; nivelActual="unidad";} else if(u!=="all"){s=agregarPor(filtrarBase(r,u),function(x){return x.programa}); titulo="Programas de "+u; nivelActual="programa";} else {s=agregarPor(REG,function(x){return x.area}); titulo="Registro por área académica"; nivelActual="area";} } else if(vw==="ua"){ s=agregarPor(filtrarBase(r),function(x){return x.ua}); titulo="Registro por unidad académica"; nivelActual="unidad"; } else if(vw==="prog"){ s=agregarPor(filtrarBase(r,u),function(x){return x.programa}); titulo="Registro por programa educativo"; nivelActual="programa"; } else { s=agregarPor(REG,function(x){return x.aplicacion}); titulo="Registro por aplicación"; nivelActual="aplicacion"; } document.getElementById("TT").textContent=titulo; s.sort(function(a,b){return ap(b)-ap(a)}); document.getElementById("TB").innerHTML = s.map(function(d){ return ''+d.name+''+d.total+''+d.noSat+''+d.sat+''+d.sob+''+ap(d)+'%'+celdaDescarga(nivelActual, d.name)+''; }).join(''); document.getElementById("conteo-titulo").textContent = s.length+" resultado(s)"; document.getElementById("SIN-DATOS").style.display = REG.length? "none":"block"; } function renderAll(){updBC();rHero();rBar();rDon();rLin();rTbl()} function cargarDatos(){ var xhr = new XMLHttpRequest(); xhr.open("POST", egeliAjax.url, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onload = function(){ try{ var r = JSON.parse(xhr.responseText); REG = (r.success && r.data && r.data.registros) ? r.data.registros : []; } catch(e){ REG = []; } popR(); popU("all"); popP("all","all"); renderAll(); }; xhr.onerror = function(){ REG=[]; renderAll(); }; xhr.send("action=egeli_datos"); } document.addEventListener("DOMContentLoaded", function(){ document.getElementById("FA").addEventListener("change", renderAll); document.getElementById("FR").addEventListener("change", function(){var r=gR(); popU(r); popP(r,"all"); document.getElementById("FU").value="all"; document.getElementById("FP").value="all"; renderAll();}); document.getElementById("FU").addEventListener("change", function(){var r=gR(),u=gU(); popP(r,u); document.getElementById("FP").value="all"; renderAll();}); document.getElementById("FP").addEventListener("change", renderAll); document.getElementById("ba").addEventListener("click", function(){vw="area";renderAll()}); document.getElementById("bu").addEventListener("click", function(){vw="ua";renderAll()}); document.getElementById("bp").addEventListener("click", function(){vw="prog";renderAll()}); document.getElementById("bq").addEventListener("click", function(){vw="aplic";renderAll()}); cargarDatos(); }); })(); }